병렬 컴퓨터 아키텍처
1. 개요
1. 개요
병렬 컴퓨터 아키텍처는 여러 개의 처리 장치를 사용하여 동시에 여러 작업을 처리하거나 하나의 작업을 여러 부분으로 나누어 동시에 처리하는 컴퓨터 시스템의 설계 구조이다. 이 아키텍처의 주요 목적은 계산 성능을 극대화하여 복잡하고 대규모의 문제를 효율적으로 해결하는 데 있다. 또한, 에너지 효율성을 개선하고 시스템의 신뢰성 및 가용성을 향상시키는 것도 중요한 목표이다.
병렬 컴퓨터는 주로 플린의 분류에 따라 구분된다. 이 분류는 시스템이 처리하는 명령어 스트림과 데이터 스트림의 수에 기반하여 SISD, SIMD, MISD, MIMD 등의 유형으로 나눈다. 현대 시스템에서 가장 흔한 형태는 SIMD와 MIMD이다. 또한, 메모리 구성 방식에 따라 공유 메모리 아키텍처와 분산 메모리 아키텍처로 구분되며, 클러스터 컴퓨팅과 그리드 컴퓨팅은 분산 메모리 방식의 대표적 예이다.
이러한 아키텍처는 과학기술 계산 분야, 예를 들어 기상 예측이나 유체 역학 시뮬레이션과 같은 고성능 컴퓨팅 작업에 필수적이다. 또한 빅데이터 분석, 인공지능 및 머신러닝 모델 훈련, 대규모 데이터베이스 관리 시스템, 그리고 실시간 시스템 등 다양한 현대 컴퓨팅 응용 분야의 핵심 기반을 제공한다. 병렬 처리를 통해 단일 프로세서로는 도달하기 어려운 성능과 처리량을 달성할 수 있다.
2. 병렬 컴퓨팅의 기본 개념
2. 병렬 컴퓨팅의 기본 개념
2.1. 병렬성 vs. 동시성
2.1. 병렬성 vs. 동시성
병렬성과 동시성은 병렬 컴퓨팅의 근간을 이루는 핵심 개념이지만, 그 의미와 구현 수준에서 차이를 보인다. 병렬성은 물리적으로 여러 개의 처리 장치(예: CPU 코어, GPU 스트림 프로세서)가 동시에 작업을 수행하는 것을 의미한다. 이는 하드웨어 수준에서의 실제 동시 실행에 해당하며, 멀티코어 프로세서나 다중 프로세서 시스템과 같은 병렬 컴퓨터 아키텍처의 존재를 전제로 한다. 주된 목적은 단일 작업의 실행 시간을 단축하거나 단위 시간당 처리량을 늘리는 것이다.
반면, 동시성은 논리적인 개념으로, 여러 작업이 동시에 진행되는 것처럼 보이게 하는 실행 방식이다. 하나의 처리 장치가 시분할 방식으로 여러 작업을 빠르게 전환하여 실행함으로써 동시에 처리되는 착각을 불러일으킨다. 운영체제의 프로세스 스케줄링이 대표적인 예시이며, 이는 병렬 하드웨어가 없이도 구현될 수 있다. 따라서 동시성은 병렬성을 포함하는 더 넓은 개념으로 볼 수 있다.
두 개념의 구현 모델도 구분된다. 병렬성은 데이터 병렬 처리나 작업 병렬 처리와 같이 작업을 물리적 자원에 명시적으로 매핑하여 성능 향상을 추구한다. 동시성은 멀티태스킹, 이벤트 기반 프로그래밍, 협동적 멀티태스킹 등을 통해 자원의 효율적 활용과 응답성을 높이는 데 중점을 둔다. 현대 컴퓨팅 시스템은 하이퍼스레딩과 같은 기술을 통해 하나의 물리적 코어가 여러 개의 논리적 스레드를 동시에 실행하는 방식으로, 동시성과 병렬성을 혼합하여 활용한다.
2.2. 암달의 법칙과 확장성
2.2. 암달의 법칙과 확장성
암달의 법칙은 병렬 컴퓨팅에서 이론적인 속도 향상의 한계를 설명하는 기본 원리이다. 이 법칙에 따르면, 프로그램의 전체 실행 시간 중 병렬화할 수 없는 순차적 부분의 비율이 병렬 처리로 인한 최대 성능 향상을 결정한다. 예를 들어 프로그램의 90%가 병렬화 가능하고 10%가 순차적으로 실행되어야 한다면, 아무리 많은 프로세서를 사용하더라도 최대 10배의 속도 향상만 가능하다는 것을 의미한다. 이는 병렬 컴퓨터 아키텍처 설계 시 병목 현상을 고려해야 할 중요성을 보여준다.
확장성은 병렬 컴퓨터 시스템이 처리 장치의 수를 증가시켰을 때 성능이 비례하여 향상되는 능력을 말한다. 이상적인 확장성은 프로세서 수를 N배 증가시켰을 때 프로그램 실행 속도도 N배 향상되는 선형 확장성을 의미한다. 그러나 암달의 법칙에 의해 순차적 부분의 존재, 프로세서 간 통신 오버헤드, 메모리 경합, 부하 불균형 등의 요인으로 인해 실제 시스템에서는 선형 확장성을 달성하기 어렵다.
병렬 시스템의 확장성을 평가할 때는 보통 약한 확장성과 강한 확장성 두 가지 관점에서 본다. 강한 확장성은 문제의 크기를 고정한 채 프로세서 수만 증가시켜 속도 향상을 측정하는 것이며, 약한 확장성은 프로세서 수가 증가함에 따라 문제의 크기도 비례하여 증가시켜 효율성을 측정하는 방식이다. 대규모 클러스터 컴퓨팅이나 그리드 컴퓨팅 시스템을 설계할 때는 이러한 확장성 특성이 매우 중요하게 고려된다.
암달의 법칙이 초기에는 비관적인 전망을 제시했지만, 실제 HPC 응용 분야에서는 문제의 규모가 커질수록 병렬화 가능한 부분이 매우 크다는 것이 관찰된다. 이는 구스타프슨의 법칙으로 설명되며, 대규모 빅데이터 처리나 과학기술 계산과 같은 분야에서 병렬 컴퓨터 아키텍처의 효과적인 활용을 가능하게 하는 이론적 근거가 된다.
3. 병렬 컴퓨터의 분류 (플린의 분류)
3. 병렬 컴퓨터의 분류 (플린의 분류)
3.1. SISD (단일 명령어 단일 데이터)
3.1. SISD (단일 명령어 단일 데이터)
SISD는 플린의 분류에서 정의된 네 가지 기본 컴퓨터 아키텍처 중 하나로, '단일 명령어 스트림, 단일 데이터 스트림'을 의미한다. 이는 전통적인 폰 노이만 구조의 순차적 컴퓨터가 따르는 모델이다. SISD 시스템은 한 번에 하나의 명령어가 하나의 데이터 항목을 처리하는 방식으로 동작한다. 즉, 단일 프로세서가 메모리에서 하나의 명령어를 읽어오고, 그 명령어가 하나의 데이터 피연산자에 대해 연산을 수행한다. 대부분의 초기 컴퓨터와 오늘날의 단일 코어 마이크로프로세서는 기본적으로 이 SISD 모델에 해당한다.
이 아키텍처의 핵심 특징은 명령어의 실행이 순차적으로 이루어진다는 점이다. 프로그램 카운터가 지정하는 다음 명령어를 차례대로 페치하고 실행하는 과정이 반복된다. 따라서 본질적으로 병렬 처리를 지원하지 않으며, 성능 향상은 주로 클럭 속도를 높이거나 파이프라이닝과 같은 명령어 수준 병렬성 기법을 도입하여 달성한다. 파이프라이닝은 하나의 명령어 처리 단계를 여러 단계로 나누고, 서로 다른 명령어들을 각 단계에서 겹쳐서 실행함으로써 처리량을 높이는 기술이다.
SISD는 가장 기본적이고 직관적인 모델이지만, 암달의 법칙에 의해 순차적 부분이 성능 향상의 한계를 결정하기 때문에 순수한 형태로는 현대의 고성능 계산 요구를 충족시키기 어렵다. 그럼에도 불구하고, 이 모델은 병렬 컴퓨팅의 다른 유형인 SIMD나 MIMD를 이해하기 위한 중요한 기준점이 된다. 복잡한 병렬 컴퓨터 시스템 내의 개별 처리 유닛은 여전히 SISD 방식으로 동작할 수 있으며, 이러한 기본 모델의 조합과 확장이 다양한 병렬 아키텍처를 구성한다.
3.2. SIMD (단일 명령어 복수 데이터)
3.2. SIMD (단일 명령어 복수 데이터)
SIMD(단일 명령어 복수 데이터)는 플린의 분류에서 정의된 병렬 컴퓨터 아키텍처 유형 중 하나로, 하나의 제어 유닛이 모든 처리 요소에 동일한 명령어를 동시에 브로드캐스트하지만, 각 처리 요소는 서로 다른 데이터에 대해 그 명령어를 실행하는 방식이다. 이는 데이터 수준의 병렬 처리를 구현하는 전형적인 모델로, 동일한 연산을 대량의 데이터에 반복 적용해야 하는 작업에 매우 효율적이다.
SIMD 아키텍처의 대표적인 예로는 초기 벡터 프로세서와 현대 CPU의 MMX, SSE, AVX와 같은 명령어 집합 확장, 그리고 GPU(그래픽 처리 장치)의 코어 배열이 있다. 특히 GPU는 수천 개의 간단한 코어를 갖춘 SIMD 방식으로 작동하여 그래픽 렌더링뿐만 아니라 과학기술 계산과 머신러닝과 같은 일반 목적 병렬 계산(GPGPU)에 널리 활용된다.
이 아키텍처의 주요 장점은 제어 유닛이 하나이므로 명령어 인출 및 해독에 필요한 하드웨어와 전력이 절감되어 에너지 효율이 높다는 점이다. 또한, 모든 처리 요소가 동기화되어 동일한 명령어를 실행하므로 프로그래밍 및 동기화 부담이 MIMD 방식에 비해 상대적으로 적다. 그러나 모든 데이터 흐름이 동일한 연산을 필요로 할 때만 효과적이므로, 조건 분기나 서로 다른 연산이 필요한 알고리즘에는 적합하지 않다는 한계를 가진다.
SIMD는 미디어 처리, 이미지 처리, 신호 처리, 암호학, 그리고 대규모 행렬 연산이 필요한 인공지능 모델의 학습과 추론과 같은 분야에서 핵심적인 역할을 한다. 현대 컴퓨팅에서는 CPU 내부의 SIMD 확장 명령어와 전용 가속기를 함께 사용하여 성능을 극대화하는 하이브리드 방식이 일반화되어 있다.
3.3. MISD (복수 명령어 단일 데이터)
3.3. MISD (복수 명령어 단일 데이터)
MISD는 플린의 분류에서 복수 명령어 단일 데이터 흐름을 의미하는 아키텍처 유형이다. 이는 여러 개의 처리 장치가 서로 다른 명령어를 실행하면서 하나의 공통된 데이터 스트림을 처리하는 구조를 가리킨다. 이론적으로는 존재하지만, 실제로 구현된 범용 컴퓨팅 시스템의 사례는 매우 드물다. MISD 구조는 주로 특수 목적의 고신뢰성 시스템이나 내결함성 시스템에서 그 개념이 응용된다.
MISD의 가장 대표적인 예시는 다중화된 시스템에서 동일한 데이터에 대해 서로 다른 알고리즘을 병렬로 실행하여 결과를 비교하고 검증하는 방식이다. 예를 들어, 비행 제어 시스템이나 원자력 발전소 제어와 같이 고장에 극도로 민감한 실시간 시스템에서, 여러 독립적인 처리 장치가 동일한 입력 데이터를 받아 각각 계산을 수행하고, 그 결과를 투표 방식으로 비교하여 오류를 탐지하고 정정하는 데 활용될 수 있다. 이는 시스템의 신뢰성 및 가용성 향상이라는 병렬 컴퓨팅의 주요 목적 중 하나를 달성하는 한 방법이다.
일반적인 범용 병렬 컴퓨터에서는 MISD 모델이 널리 사용되지 않는다. 대부분의 현대 병렬 컴퓨터 아키텍처는 SIMD나 MIMD에 기반을 두고 있다. SIMD는 GPU와 같은 데이터 병렬 처리에, MIMD는 멀티코어 프로세서나 클러스터 컴퓨팅과 같은 작업 병렬 처리에 각각 적합하기 때문이다. 따라서 MISD는 플린의 분류를 이론적으로 완성하는 하나의 범주로서, 또는 특정 니치 분야의 설계 개념으로 이해되는 경우가 많다.
3.4. MIMD (복수 명령어 복수 데이터)
3.4. MIMD (복수 명령어 복수 데이터)
MIMD는 플린의 분류에서 가장 일반적이고 유연한 병렬 컴퓨터 아키텍처 유형이다. 이 아키텍처에서는 여러 개의 독립적인 프로세서가 각각 자신만의 명령어 스트림과 데이터 스트림을 가지고 동시에 서로 다른 작업을 수행한다. 각 처리 요소는 독립적으로 제어 유닛을 가지고 있어 서로 다른 알고리즘을 실행하거나 동일한 문제의 서로 다른 부분을 다른 방식으로 처리할 수 있다. 이는 모든 프로세서가 동일한 명령어를 실행하는 SIMD 아키텍처와 대비되는 특징이다.
MIMD 시스템은 메모리 구성 방식에 따라 크게 공유 메모리와 분산 메모리로 구분된다. 공유 메모리 MIMD 시스템은 모든 프로세서가 하나의 공통 주기억장치를 접근하며, UMA와 NUMA로 세분화된다. 반면, 분산 메모리 MIMD 시스템은 각 프로세서가 자신의 지역 메모리를 가지며, 메시지 전달 방식을 통해 통신한다. 대규모 클러스터 컴퓨팅 시스템이나 MPP가 이에 해당한다.
이러한 유연성 덕분에 MIMD는 다양한 응용 분야에서 널리 사용된다. 멀티코어 프로세서를 탑재한 일반적인 개인용 컴퓨터와 서버부터, 수천 개의 노드로 구성된 슈퍼컴퓨터까지 그 형태가 다양하다. 또한 멀티태스킹 환경에서 여러 개의 독립적인 응용 프로그램을 동시에 실행하거나, 하나의 큰 작업을 비동기적으로 병렬 처리하는 데 적합하다.
MIMD를 위한 주요 병렬 프로그래밍 모델로는 공유 메모리 시스템을 위한 스레드 기반 프로그래밍과 OpenMP, 그리고 분산 메모리 시스템을 위한 MPI가 있다. 이러한 모델들은 프로그래머가 복잡한 하드웨어 아키텍처를 효율적으로 활용하여 과학기술 계산, 빅데이터 처리, 인공지능 학습과 같은 계산 집약적 문제를 해결할 수 있게 지원한다.
4. 메모리 아키텍처에 따른 분류
4. 메모리 아키텍처에 따른 분류
4.1. 공유 메모리 아키텍처 (UMA, NUMA)
4.1. 공유 메모리 아키텍처 (UMA, NUMA)
공유 메모리 아키텍처는 여러 프로세서가 하나의 물리적 메모리 공간을 공유하는 병렬 컴퓨터 설계 방식이다. 모든 프로세서가 이 공유 메모리에 균일하게 접근할 수 있는 경우를 UMA(Uniform Memory Access)라고 한다. UMA 시스템에서는 메모리 접근 지연 시간이 프로세서나 메모리 위치에 관계없이 동일하며, 대칭형 멀티프로세서가 대표적인 예이다. 이 방식은 프로그래밍 모델이 단순하고 데이터 일관성을 유지하기 쉬운 장점이 있다.
하지만 프로세서 수가 증가하면 모든 프로세서가 단일 메모리와 버스를 공유함에 따라 병목 현상이 발생하고 확장성에 한계가 생긴다. 이러한 문제를 해결하기 위해 등장한 것이 NUMA(Non-Uniform Memory Access) 아키텍처이다. NUMA 시스템에서는 각 프로세서 또는 프로세서 그룹에 로컬 메모리가 할당되며, 전체 메모리 공간은 논리적으로는 여전히 하나로 통합되어 있다.
NUMA의 핵심 특징은 메모리 접근 시간이 불균일하다는 점이다. 프로세서가 자신의 로컬 메모리에 접근하는 속도는 빠르지만, 다른 프로세서의 로컬 메모리(원격 메모리)에 접근할 때는 상대적으로 느린 네트워크 지연이 발생한다. 따라서 성능을 최적화하기 위해서는 운영체제와 응용 프로그램이 데이터를 가능한 한 접근하는 프로세서의 로컬 메모리에 배치하는 NUMA 인식 프로그래밍이 중요해진다. 현대의 대규모 서버와 고성능 컴퓨팅 시스템은 주로 NUMA 기반의 다중 소켓 설계를 채택하고 있다.
4.2. 분산 메모리 아키텍처 (클러스터, MPP)
4.2. 분산 메모리 아키텍처 (클러스터, MPP)
분산 메모리 아키텍처는 각 프로세서가 자신만의 지역 메모리를 독립적으로 가지는 구조이다. 프로세서 간의 통신과 데이터 교환은 메시지 전달 방식을 통해 네트워크를 거쳐 이루어진다. 이는 공유 메모리 아키텍처와 근본적으로 다른 접근 방식으로, 시스템을 구성하는 노드들이 물리적으로 분리될 수 있어 확장성이 매우 높다는 특징이 있다. 대표적인 분산 메모리 시스템으로는 클러스터 컴퓨팅과 대규모 병렬 처리 시스템이 있다.
클러스터는 일반적으로 상용 서버나 워크스테이션을 고속 네트워크로 연결하여 하나의 시스템처럼 동작하도록 구성한다. 각 노드는 독립된 운영체제를 실행하며, 병렬 작업은 MPI와 같은 메시지 전달 라이브러리를 통해 조율된다. 클러스터는 비용 대비 성능이 우수하고 표준 하드웨어를 사용하여 구축 및 확장이 비교적 용이하여, 웹 호스팅, 과학기술 계산, 빅데이터 처리 플랫폼으로 널리 사용된다.
대규모 병렬 처리 시스템은 수천 개 이상의 프로세서를 특수 제작된 고속 상호 연결 네트워크로 연결한 초고성능 시스템이다. 각 처리 노드는 전용 메모리를 가지며, 네트워크는 극도로 낮은 지연 시간과 높은 대역폭을 제공하도록 최적화되어 있다. MPP 시스템은 기상 예측, 유전체 분석, 핵 시뮬레이션과 같은 가장 복잡하고 계산 집약적인 고성능 컴퓨팅 문제를 해결하는 데 주로 활용된다.
분산 메모리 시스템의 주요 과제는 프로그래머가 데이터 분배와 프로세스 간 통신을 명시적으로 관리해야 하므로 프로그래밍 복잡도가 증가한다는 점이다. 또한 통신 오버헤드와 부하 불균형이 전체 성능에 큰 영향을 미칠 수 있다. 그러나 하드웨어의 표준화와 소프트웨어 도구의 발전으로 인해 이러한 시스템은 가장 일반적인 병렬 컴퓨팅 플랫폼으로 자리 잡았다.
5. 병렬 프로그래밍 모델
5. 병렬 프로그래밍 모델
5.1. 공유 메모리 모델 (스레드, OpenMP)
5.1. 공유 메모리 모델 (스레드, OpenMP)
공유 메모리 모델은 여러 개의 프로세서나 스레드가 하나의 공통된 물리적 또는 논리적 메모리 공간을 공유하여 통신하고 데이터를 교환하는 병렬 프로그래밍 방식을 말한다. 이 모델에서 처리 요소들은 공유 변수를 통해 데이터를 읽고 쓰며 상호작용하므로, 프로그래머는 명시적으로 데이터를 전송하는 코드를 작성할 필요가 없다는 장점이 있다. 대신, 여러 스레드가 동시에 같은 메모리 위치에 접근할 때 발생할 수 있는 경쟁 조건이나 데이터 불일치 문제를 방지하기 위해 락이나 세마포어와 같은 동기화 메커니즘을 사용하여 접근을 제어해야 한다.
이 모델을 구현하는 대표적인 방법은 멀티스레딩 프로그래밍이다. 운영체제가 제공하는 스레드 라이브러리를 사용하여 하나의 프로세스 내에서 여러 실행 흐름을 생성하고 관리할 수 있다. 이러한 저수준 스레드 프로그래밍은 높은 유연성을 제공하지만, 동기화와 데드락 회피를 직접 처리해야 하는 복잡성이 따른다. 이를 보완하기 위해 등장한 것이 OpenMP와 같은 고수준의 API이다.
OpenMP는 C, C++, 포트란 언어를 위한 공유 메모리 병렬 프로그래밍 표준으로, 컴파일러 지시문, 라이브러리 루틴, 환경 변수의 집합으로 구성된다. 프로그래머는 병렬로 실행시키고자 하는 코드 블록 앞에 #pragma omp parallel과 같은 간단한 지시문을 추가함으로써, 컴파일러가 자동으로 스레드를 생성하고 작업을 분배하는 코드를 생성하도록 할 수 있다. 또한 작업 분할, 루프 병렬화, 감소 연산 등 다양한 병렬 패턴을 지원하여 생산성을 크게 높인다.
공유 메모리 모델은 멀티코어 프로세서를 장착한 단일 컴퓨터나 SMP와 같은 공유 메모리 멀티프로세서 시스템에서 가장 효과적으로 동작한다. 그러나 모든 프로세서가 메모리에 균일하게 접근할 수 있는 UMA 구조를 벗어나, 접근 지연 시간이 메모리 위치에 따라 다른 NUMA 구조에서는 성능 최적화에 추가적인 고려가 필요하다. 이 모델은 데이터 교환이 빈번한 응용 프로그램이나 점진적으로 병렬화를 적용하기에 용이하다는 장점이 있다.
5.2. 메시지 전달 모델 (MPI)
5.2. 메시지 전달 모델 (MPI)
메시지 전달 모델은 분산 메모리 아키텍처를 가진 병렬 컴퓨터에서 주로 사용되는 프로그래밍 모델이다. 이 모델에서는 각 프로세스가 자신의 지역 메모리 공간을 가지며, 프로세스들 간의 데이터 교환과 동기화는 명시적인 메시지 송수신을 통해서만 이루어진다. 이는 모든 프로세스가 하나의 공통 메모리 공간을 공유하는 공유 메모리 모델과 근본적으로 다르다. 메시지 전달 모델의 핵심은 통신과 동기화가 프로그래머에 의해 완전히 제어된다는 점이며, 이는 확장성이 뛰어나 대규모 클러스터나 MPP 시스템에 적합하다.
이 모델의 사실상 표준은 MPI이다. MPI는 이기종 네트워크로 연결된 컴퓨터들 간의 효율적인 통신을 위한 라이브러리 API 사양으로, 포인트 투 포인트 통신과 집단 통신을 모두 지원한다. 프로그래머는 MPI 함수를 호출하여 데이터를 패킹하고, 특정 프로세스로 메시지를 보내거나, 다른 프로세스로부터 메시지를 받는 작업을 수행한다. 이 모델은 통신 지연 시간을 정확히 인지하고 최소화하는 것이 성능 최적화의 핵심 과제가 된다.
메시지 전달 모델의 주요 장점은 메모리 일관성 문제가 발생하지 않으며, 하드웨어 독립성이 높아 다양한 시스템에서 이식성이 좋다는 점이다. 반면, 프로그래머가 데이터 분배와 통신을 직접 설계해야 하므로 프로그래밍 복잡도가 높고, 데드락과 같은 오류 가능성이 있다. 이 모델은 과학기술 계산이나 대규모 시뮬레이션과 같이 데이터 지역성이 명확한 응용 분야에서 강점을 보인다.
5.3. 데이터 병렬 모델
5.3. 데이터 병렬 모델
데이터 병렬 모델은 병렬 처리의 기본 패러다임 중 하나로, 동일한 연산을 여러 데이터 요소에 동시에 적용하는 방식을 말한다. 이 모델은 특히 SIMD 아키텍처와 밀접하게 연관되어 있으며, 하나의 명령어가 여러 데이터 요소에 대해 병렬로 실행되는 특징을 가진다. 데이터 병렬성은 벡터 프로세서나 현대의 GPU와 같은 하드웨어에서 효율적으로 구현되며, 대규모 배열이나 행렬 연산에 적합하다.
이 모델의 핵심은 작업을 데이터의 관점에서 분할하는 것이다. 예를 들어, 큰 이미지의 모든 픽셀에 동일한 필터를 적용하거나, 대용량 배열의 모든 요소에 동일한 산술 연산을 수행하는 작업이 여기에 해당한다. 프로그래머는 전체 데이터 집합에 적용될 단일 연산 흐름을 정의하면 되며, 하드웨어나 런타임 시스템이 데이터를 여러 처리 요소에 자동으로 분배하고 병렬로 처리한다. 이는 공유 메모리 모델이나 메시지 전달 모델과는 다른 접근 방식이다.
데이터 병렬 프로그래밍을 지원하는 대표적인 언어 및 프레임워크로는 CUDA, OpenCL, 그리고 고수준 언어에서는 APL이나 MATLAB의 벡터화 연산 등이 있다. 이러한 도구들은 개발자가 명시적으로 스레드를 관리하거나 메시지 전달 인터페이스를 사용하여 통신할 필요 없이 데이터 병렬 알고리즘을 표현할 수 있게 해준다.
데이터 병렬 모델의 주요 장점은 프로그래밍의 단순성과 규칙적인 데이터 구조에서의 높은 처리 효율성이다. 그러나 모든 알고리즘이 균일한 데이터 연산으로 표현될 수 있는 것은 아니므로, 적용 가능성이 제한적일 수 있다. 이 모델은 과학기술 계산, 컴퓨터 비전, 머신러닝의 학습 및 추론 단계, 그리고 신호 처리와 같은 분야에서 널리 활용되고 있다.
6. 병렬 처리의 주요 하드웨어 요소
6. 병렬 처리의 주요 하드웨어 요소
6.1. 멀티코어 프로세서
6.1. 멀티코어 프로세서
멀티코어 프로세서는 하나의 물리적 집적 회로 칩 안에 두 개 이상의 독립적인 중앙 처리 장치 코어를 통합한 프로세서이다. 이는 플린의 분류에서 MIMD 아키텍처에 해당하며, 각 코어가 별도의 명령어와 데이터를 처리할 수 있다. 단일 코어의 클럭 속도를 극한까지 높이는 데 따른 전력 소비와 발열 문제를 극복하고자 등장했으며, 동일한 클럭 속도에서 더 많은 작업을 동시에 처리함으로써 전반적인 성능 향상과 에너지 효율성을 달성하는 것이 주요 목적이다.
멀티코어 프로세서는 일반적으로 공유 메모리 아키텍처를 채택한다. 모든 코어가 단일 물리적 칩 위에 통합되어 있기 때문에, 칩 내부의 고대역폭 버스나 크로스바 스위치를 통해 캐시 메모리와 주 메모리를 공유하는 UMA 구조가 일반적이다. 이는 코어 간 데이터 교환과 동기화가 상대적으로 빠르게 이루어질 수 있게 한다. 대표적인 예로는 인텔과 AMD의 현대적 x86 기반 마이크로프로세서들이 있으며, 스마트폰과 태블릿 컴퓨터에 사용되는 ARM 아키텍처 기반의 애플리케이션 프로세서도 대부분 멀티코어 설계를 따른다.
멀티코어 시스템의 성능을 최대한 활용하기 위해서는 병렬 프로그래밍 기법이 필수적이다. 운영 체제는 여러 코어에 작업을 분배하는 스케줄링을 담당하며, 개발자는 스레드를 사용하는 공유 메모리 모델 프로그래밍이나 OpenMP와 같은 API를 이용해 명시적으로 병렬성을 표현해야 한다. 멀티코어 프로세서는 데스크톱 컴퓨터와 서버부터 임베디드 시스템에 이르기까지 광범위하게 적용되어 현대 컴퓨팅의 기반을 이루고 있으며, GPU나 TPU 같은 전용 가속기와 결합하여 고성능 컴퓨팅과 인공지능 학습에도 핵심 역할을 한다.
6.2. GPU와 가속기
6.2. GPU와 가속기
GPU는 본래 그래픽 처리를 위해 설계된 특수 목적의 프로세서이다. 그래픽 렌더링은 수많은 픽셀이나 정점에 대해 동일한 연산을 반복적으로 수행하는 작업이므로, GPU는 수백 개에서 수천 개에 이르는 작은 코어를 내장하여 이러한 데이터 병렬성을 극대화하는 SIMD 방식의 아키텍처를 채택했다. 이러한 구조는 행렬 연산이나 벡터 연산과 같이 규칙적이고 대규모의 데이터를 처리하는 데 매우 효율적이어서, 과학기술 계산과 인공지능 학습과 같은 일반 목적의 병렬 계산 작업에도 널리 활용되기 시작했다. 이처럼 그래픽 처리 이외의 계산에 GPU를 사용하는 것을 GPGPU라고 한다.
GPU 기반의 가속기는 CPU와 함께 시스템에서 코프로세서 역할을 수행한다. CPU는 복잡한 제어 흐름과 순차적 작업을 처리하는 반면, GPU는 병렬성이 높은 계산 집약적 작업을 위임받아 처리한다. 이를 통해 이종 컴퓨팅 시스템이 구성되며, 전체적인 시스템의 처리 성능과 에너지 효율성을 크게 높일 수 있다. 엔비디아의 CUDA와 오픈CL은 이러한 GPU를 범용 계산에 활용하기 위한 주요 프로그래밍 모델 및 플랫폼으로 자리 잡았다.
GPU 외에도 다양한 전용 가속 하드웨어가 등장하고 있다. 인공지능 추론 및 학습에 특화된 TPU, FPGA를 활용한 재구성 가능한 가속기, 신경망 처리 장치 등이 그 예이다. 이러한 가속기들은 특정 워크로드나 알고리즘에 맞춰 하드웨어를 최적화함으로써 GPU보다도 더 높은 성능과 효율을 달성하는 것을 목표로 한다. 이들은 데이터 센터, 슈퍼컴퓨터, 그리고 엣지 컴퓨팅 장비에 이르기까지 병렬 컴퓨팅 인프라의 핵심 요소로 통합되고 있다.
6.3. 상호 연결 네트워크
6.3. 상호 연결 네트워크
상호 연결 네트워크는 병렬 컴퓨터 시스템에서 개별 프로세서나 컴퓨팅 노드 간에 데이터와 제어 신호를 전달하는 통신 인프라를 말한다. 이 네트워크의 성능과 구조는 전체 시스템의 효율성과 확장성에 직접적인 영향을 미친다. 처리 요소들이 서로 협력하여 작업을 수행하려면 낮은 지연 시간과 높은 대역폭을 가진 효율적인 연결이 필수적이다.
상호 연결 네트워크의 토폴로지, 즉 물리적 배치 방식은 다양하다. 일반적인 형태로는 모든 노드가 중앙 스위치에 연결되는 스타 네트워크, 노드들이 링 모양으로 연결되는 링 네트워크, 그리고 각 노드가 그리드 형태로 배열되는 메시 네트워크 등이 있다. 고성능 컴퓨팅 환경에서는 하이퍼큐브나 토러스 네트워크와 같은 더 복잡한 토폴로지도 사용된다. 네트워크의 성능은 지름, 대역폭, 라우팅 알고리즘, 결함 허용 능력 등 여러 요소로 평가된다.
네트워크의 구현 방식은 시스템의 규모와 목적에 따라 달라진다. 소규모 공유 메모리 시스템 내의 멀티코어 프로세서 간에는 온칩 네트워크나 고속 버스가 사용된다. 반면, 대규모 클러스터 컴퓨팅이나 MPP 시스템에서는 이더넷, 인피니밴드, 또는 사용자 정의 고속 상호연결 기술을 기반으로 한 스위치형 네트워크가 구축된다. 이러한 네트워크는 메시지 전달 프로그래밍 모델의 기반이 되어 노드 간 통신을 담당한다.
상호 연결 네트워크의 설계는 시스템 전체의 병목 현상을 최소화하는 데 핵심적이다. 네트워크 대역폭이 부족하거나 지연 시간이 길면, 프로세서들이 데이터를 기다리는 유휴 시간이 증가하여 병렬 처리의 이점이 크게 감소한다. 따라서 현대의 병렬 슈퍼컴퓨터 아키텍처에서는 계산 능력만큼이나 고성능 상호 연결 네트워크의 개발에 많은 노력을 기울이고 있다.
7. 병렬 컴퓨터의 성능 평가
7. 병렬 컴퓨터의 성능 평가
7.1. 속도향상과 효율성
7.1. 속도향상과 효율성
병렬 컴퓨터의 성능을 평가하는 핵심 지표는 속도향상과 효율성이다. 속도향상은 병렬화를 통해 얻는 성능 향상의 정도를, 효율성은 병렬 처리 장치를 얼마나 잘 활용하는지를 나타낸다.
속도향상은 일반적으로 병렬 처리 시 걸리는 시간과 단일 처리 장치를 사용했을 때의 시간을 비교하여 계산한다. 이론적으로 처리 장치 수를 N배 늘리면 실행 시간이 1/N로 줄어들어 속도향상도 N배가 되어야 하지만, 실제로는 여러 요인으로 인해 이 이상적인 선형 속도향상을 달성하기 어렵다. 프로그램 내에서 병렬화가 불가능한 순차적 부분의 존재, 처리 장치 간의 통신 및 동기화에 따른 오버헤드, 작업 부하의 불균형 등이 주요 저해 요인으로 작용한다.
효율성은 속도향상을 사용된 처리 장치 수로 나눈 값으로 정의된다. 효율성이 100%에 가까울수록 모든 처리 장치가 거의 유휴 상태 없이 유용한 작업을 수행하고 있음을 의미한다. 효율성을 저하시키는 주요 원인은 병목 현상이다. 이는 시스템의 특정 부분이 전체 성능을 제한하는 경우를 말하며, 느린 상호 연결 네트워크, 공유 자원에 대한 경쟁, 또는 암달의 법칙에 따른 순차적 코드 부분 등에서 발생할 수 있다.
따라서 병렬 시스템의 성능을 최적화하기 위해서는 속도향상과 효율성을 종합적으로 분석해야 한다. 단순히 처리 장치 수를 늘리는 것만으로는 성능이 선형적으로 증가하지 않으며, 오히려 통신 비용 증가로 인해 효율성이 급격히 떨어질 수 있다. 효과적인 병렬 프로그래밍과 시스템 설계는 이러한 병목 요인을 최소화하고 작업을 고르게 분배하여 높은 효율성을 유지하면서 속도향상을 극대화하는 데 목표를 둔다.
7.2. 병목 현상 분석
7.2. 병목 현상 분석
병목 현상은 병렬 시스템에서 전체 성능을 제한하는 단일 요소나 경로를 가리킨다. 병렬 컴퓨터 아키텍처에서 병목 현상은 하드웨어와 소프트웨어 모두에서 발생할 수 있으며, 이를 분석하고 완화하는 것은 효율적인 시스템 설계와 프로그래밍의 핵심이다.
주요 병목 현상의 원인으로는 메모리 접근, 상호 연결 네트워크, 그리고 작업 부하 불균형이 있다. 공유 메모리 시스템에서는 여러 프로세서가 동일한 메모리 버스나 메모리 컨트롤러를 경쟁적으로 사용할 때 지연이 발생하며, NUMA 아키텍처에서는 원격 메모리 접근 지연이 문제가 될 수 있다. 분산 메모리 시스템에서는 노드 간 통신을 담당하는 네트워크의 대역폭과 지연 시간이 주요 병목 지점이 된다. 또한, 알고리즘이나 데이터 분배 방식의 비효율로 인해 일부 프로세서만 바쁘게 작업하고 나머지는 유휴 상태에 머무르는 작업 부하 불균형도 성능을 저하시킨다.
병목 현상을 분석하기 위한 주요 방법론에는 프로파일링과 성능 모델링이 사용된다. 프로파일링 도구를 이용하면 프로그램 실행 중 CPU 사용률, 캐시 미스율, 메모리 대역폭 사용량, MPI 통신 시간 등 세부적인 성능 데이터를 수집하여 병목 지점을 정량적으로 식별할 수 있다. 성능 모델링은 암달의 법칙과 같은 이론적 모델을 기반으로 시스템 확장에 따른 성능 변화를 예측하여 잠재적 병목을 사전에 평가한다.
병목 현상을 완화하는 전략은 그 원인에 따라 다르다. 메모리 병목에는 데이터 지역성 향상을 위한 알고리즘 최적화, 캐시 일관성 프로토콜 개선, 또는 메모리 계층 구조 재설계가 고려된다. 통신 병목에는 통신 횟수를 줄이는 알고리즘 변경, 비동기 통신 사용, 또는 고대역폭 인피니밴드 네트워크로의 전환이 효과적일 수 있다. 작업 부하 불균형에는 동적 작업 스케줄링 기법을 도입하여 작업을 유연하게 재분배하는 방법이 사용된다.
8. 병렬 컴퓨터의 응용 분야
8. 병렬 컴퓨터의 응용 분야
8.1. 과학기술 계산 (HPC)
8.1. 과학기술 계산 (HPC)
병렬 컴퓨터 아키텍처의 가장 전통적이면서도 핵심적인 응용 분야는 과학기술 계산이다. 이는 고성능 컴퓨팅의 핵심을 이루며, 복잡한 과학적 모델링이나 대규모 수치 시뮬레이션을 수행하기 위해 병렬 처리 능력이 필수적이다. 기상 예측, 항공우주 설계, 핵융합 연구, 신약 개발을 위한 분자 동역학 시뮬레이션 등은 수십억 개의 미분 방정식을 해결해야 하며, 이를 위해 수천 개의 프로세서 코어가 협력하는 슈퍼컴퓨터가 활용된다.
이러한 계산은 주로 MIMD 방식의 클러스터 컴퓨팅이나 공유 메모리 시스템에서 이루어지며, 메시지 전달 인터페이스 표준이 널리 사용된다. 최근에는 GPU와 같은 가속기를 활용한 이종 컴퓨팅 아키텍처도 과학기술 계산의 성능을 획기적으로 높이고 있다. 유체 역학이나 구조 분석과 같은 전통적인 공학 문제부터 천체물리학, 유전체학에 이르기까지 그 적용 범위는 매우 넓다.
병렬 컴퓨터를 통한 과학기술 계산의 성과는 직접적으로 국가의 연구 개발 경쟁력과 연결된다. 복잡한 현상을 정확하게 모사하고 예측함으로써 실험 비용을 절감하고, 위험한 환경에서의 실험을 대체하며, 이전에는 불가능했던 규모의 문제를 해결할 수 있게 한다. 이는 궁극적으로 과학적 발견을 가속화하고 첨단 기술 개발을 뒷받침하는 기반 인프라 역할을 한다.
8.2. 빅데이터 처리
8.2. 빅데이터 처리
빅데이터 처리는 병렬 컴퓨터 아키텍처의 핵심 응용 분야 중 하나이다. 빅데이터는 데이터베이스나 전통적인 데이터 처리 소프트웨어로는 처리하기 어려울 정도로 방대한 양의 데이터를 의미하며, 이를 효율적으로 분석하기 위해서는 높은 수준의 병렬 처리가 필수적이다. 하둡과 스파크와 같은 대표적인 빅데이터 처리 프레임워크는 분산 메모리 아키텍처를 기반으로 설계되어, 수백 대에서 수천 대의 서버로 구성된 클러스터 상에서 데이터를 분산 저장하고 병렬 연산을 수행한다.
빅데이터 처리 파이프라인은 일반적으로 데이터 수집, 저장, 처리, 분석의 단계로 구성되며, 각 단계마다 특화된 병렬 컴퓨팅 기술이 활용된다. 예를 들어, 데이터 수집 단계에서는 카프카와 같은 분산 메시지 큐 시스템이, 배치 처리에는 맵리듀스 프로그래밍 모델이, 실시간 스트림 처리에는 아파치 플링크나 아파치 스톰과 같은 엔진이 사용된다. 이러한 시스템들은 MIMD 방식의 분산 컴퓨팅을 통해 대규모 데이터셋을 여러 작업 노드에 나누어 처리함으로써 단일 컴퓨터로는 도달할 수 없는 처리 속도와 규모를 실현한다.
병렬 컴퓨터 아키텍처는 빅데이터 분석의 복잡한 알고리즘 수행에도 기여한다. 대규모 로그 파일 분석, 웹 크롤링, 추천 시스템, 사기 탐지 모델 학습과 같은 작업은 본질적으로 데이터 병렬성이 높다. GPU나 TPU와 같은 가속기를 활용한 데이터 병렬 모델은 특히 머신러닝 모델 훈련과 같은 계산 집약적 작업의 속도를 획기적으로 높인다. 또한, 인메모리 컴퓨팅 기술을 활용한 분산 메모리 시스템은 데이터 마이닝과 대화형 쿼리 처리의 성능을 극대화한다.
결국, 방대한 데이터에서 가치 있는 통찰을 실시간에 가깝게 추출하는 현대의 빅데이터 생태계는 고성능 상호 연결 네트워크, 효율적인 자원 관리자, 그리고 강력한 병렬 프로그래밍 모델을 갖춘 병렬 컴퓨터 시스템 없이는 구축될 수 없다. 이는 병렬 컴퓨팅이 이론적인 개념을 넘어 산업 전반의 데이터 중심 의사결정을 실제로 뒷받침하는 핵심 인프라임을 보여준다.
8.3. 인공지능/머신러닝
8.3. 인공지능/머신러닝
병렬 컴퓨터 아키텍처는 현대 인공지능과 머신러닝 발전의 핵심 기반 기술이다. 대규모 신경망 모델의 훈련과 추론 과정에는 방대한 행렬 연산과 텐서 계산이 수반되며, 이러한 계산은 본질적으로 높은 수준의 데이터 병렬성과 작업 병렬성을 가지고 있다. 따라서 GPU와 같은 가속기를 활용한 SIMD 방식의 병렬 처리가 표준이 되었다. 특히 딥러닝 프레임워크들은 CUDA나 OpenCL과 같은 병렬 컴퓨팅 플랫폼을 백엔드로 활용하여 연산을 가속화한다.
인공지능 응용 분야에 따라 요구되는 병렬 처리 방식도 다르다. 대규모 모델 훈련은 수백乃至 수천 개의 GPU를 클러스터로 구성한 분산 메모리 시스템에서 메시지 전달 인터페이스 기반으로 이루어지는 경우가 많다. 반면, 추론 서비스는 멀티코어 프로세서를 사용한 공유 메모리 시스템이나 특수화된 AI 가속기에서 저지연 처리를 목표로 한다. 자연어 처리, 컴퓨터 비전, 추천 시스템 등 모든 주요 AI 분야는 병렬 컴퓨팅 없이는 실용화되기 어려웠을 것이다.
